package com.ssm.promotion.core.mydlbp_nsgaiii.core;

/**
 * Create by whk0710 on 2/18/2019
 * 此类表示MRDLBP问题的Solution个体
 * todo
 * */
public class Solution implements java.io.Serializable{

    MRDLBPProblem problem;

    private double[] objective; //保存目标函数值
    private int objective_num;  //保存目标函数个数
    private int robots_num;     //保存已使用机器人总数，目标函数之一？

    private DecisionVariable dvar;  //决策变量

    private Variable variable;      //保存编码情况 & 初始化编码解码

    private int rank;

    /**
     * 默认构造器
     * */
    public Solution(){
        problem = null;
        objective = null;
    }

    /**
     * 构造器
     * @objective_num 目标函数数目
     * */
    public Solution(int objective_num){
        this.objective_num = objective_num;
    }

    /**
     * 构造器，用于初始化种群个体
     * @problem 指定问题类型
     * todo
     * */
    public Solution(MRDLBPProblem problem) throws ClassNotFoundException{
        this.problem = problem;
        this.objective_num = 0;
        this.objective = new double[objective_num];
        this.variable = new Variable(problem);
        this.dvar = new DecisionVariable();
    }

    /**
     * 构造器，用于交叉变异时使用
     * @param problem
     * @param variable
     *
     * todo
     *
     * 思路：
     *     1）首先，建立一个类存储需要的决策变量
     *     2）其次，在此类中添加这个决策变量类
     *     3）在Variable中保存各个编码：DT、RS、PV
     *     4）在这个类中解码
     *     5）在problem类中计算目标函数值
     */
    public Solution(MRDLBPProblem problem, Variable variable){
        this.problem = problem;

        this.variable = variable;
    }

    /**
     * 返回决策变量
     * */
    public DecisionVariable getDvar(){
        return this.dvar;
    }

    /**
     * 更新决策变量
     * */
    public void setDvar(DecisionVariable dvar){
        this.dvar = dvar;
    }


    /**
     * 设置目标函数值
     * @param i
     * @param value
     */
    public void setObjective(int i, double value) {
        objective[i] = value;
    } // setObjective

    /**
     * 获取第i个目标函数值
     * @param i
     * @return
     */
    public double getObjective(int i){
        return objective[i];
    }

    //获取目标函数值个数
    public int numberOfObjectives(){
        if (objective == null)
            return 0;
        else
            return objective_num;
    }
}
